// 防抖
export function debounce(fn,times,isImmediately=true){
    let timer=null;//定时器变量，初始值为null
    let cb;//回调函数
    if(isImmediately){
        cb=function(...args){
            timer && clearTimeout(timer);//如果定时器存在，则清除定时器
            let isDone=!timer;//是否第一次执行，timer为空isDone为true
            timer=setTimeout(()=>{//设置新的定时器
                timer=null;//定时器结束后清空
            },times);
            isDone && fn.apply(this,args);//如果是第一次执行，则立即执行fn
        }
    }else{
        cb=function(...args){
            const content=this;//保存上下文
            timer && clearTimeout(timer);//清除之前的定时器
            timer=setTimeout(()=>{//设置新的定时器
                fn.apply(content,args);//超过timers后执行fn
            },times);
        }
    }
    return cb;//返回防抖后的函数
}


export function getRouterOptions(hash){
    const options={
        // 路由器配置选项
        name:"",
        params:"",
        query:"",
    };
    //hash为空或为"#home"，则默认路由为home
    if(!hash || hash=="#home"){
        options.name="home";
    }else{
        // 提取name params query信息
        //     0      1      2
        //<a href='#/name/params?query1=value1&query2=value2'></a>
        try{
            const routerArr=hash.slice(1).split("/");
            options.name=routerArr[1];
            const paramsArr=routerArr[2].split("?");
            options.params=paramsArr[0].slice(1);
            options.query=paramsArr.slice(1);
        }catch(error){
            options.name="404";
        }
    }
    return options;
}

// 返回当前时间
export function formatCreateTime(time){
    let now =new Date(time);
    let year=now.getFullYear();
    let month=now.getMonth();
    let day=now.getDay();
    return `${year}-${month}-${day}`;
}

export function formatSongTime(time){
    // 将时间转化为分钟:秒格式
    let time1=new Date(time)
    let minute=time1.getMinutes();
    let second=time1.getSeconds();
    return `${minute<10? "0"+minute : minute}:${second < 10? "0"+second : second}`;
}

// 将歌词时间进度转化为分：秒格式
export function formatLyricTime(time){
    let minute=Math.floor(time/60);
    let second=Math.floor(time%60);
    return `${minute<10? "0"+minute : minute}:${second < 10? "0"+second : second}`;
}


// canvas 高斯模糊
const imgBox=document.querySelector(".player-background-image");
const src="../images/all 5.jpg";
export function blur(ele,src){
    // 
    const canvas=document.createElement("canvas");
    canvas.width=100;
    canvas.height=100;
    const ctx=canvas.getContext("2d");

    const img=new Image();
    img.src=src;
    img.setAttribute("crossorigin","anonymous");

    img.onload=function(){
        const {width,height}=canvas;
        ctx.drawImage(img,0,0,img.width,img.height,0,0,width,height);
        let imgData=ctx.getImageData(0,0,width,height);
        // 高斯模糊
        let gaussData=gaussBlur(imgData);
        ctx.putImageData(gaussData,0,0);

        // 让图片转变为base64编码格式
        let imgSrc=canvas.toDataURL();
        // 设置背景图片
        ele.style.backgroundImage="url("+imgSrc+")";
    };
    
}

// blur(imgBox,src);

function gaussBlur(imgData){
    var pixes=imgData.data;
    var width=imgData.width;
    var height=imgData.height;
    var gaussMatrix=[],
    gaussSum=0,x,y,r,g,b,a,i,j,k,len;
    
    var radius=10;
    var sigma=5;//标准差a,a描述正态分布资料数据分布的离散程度，a越大，数据分布越分散，a越小，数据分布越集中
    a=1/(Math.sqrt(2*Math.PI)*sigma);
    b=-1/(2*sigma*sigma);
    // 生成高斯矩阵
    for(i=0,x=-radius;x<=radius;x++,i++){
        g=a*Math.exp(b*x*x);//标准正态分布函数，正太分布记做N（a，b），其中a=0，b=5
        gaussMatrix[i]=g;
        gaussSum+=g;
    }
    // 归一化,保证高斯矩阵的值在0，1之间
    for(i=0,len=gaussMatrix.length;i<len;i++){
        gaussMatrix[i]/=gaussSum;
    }
    //x方向一维高斯运算
    for(y=0;y<height;y++){
        for(x=0;x<width;x++){
            r=g=b=a=0;
            gaussSum=0;
            for(j=-radius;j<=radius;j++){
                k=x+j;
                if(k>=0 && k<width){
                    // 确保k没超出x的范围
                    // r,g,,b,a四个一组
                    i=(y*width+k)*4;
                    r+=pixes[i]*gaussMatrix[j+radius];
                    g+=pixes[i+1]*gaussMatrix[j+radius];
                    b+=pixes[i+2]*gaussMatrix[j+radius];
                    // a+=pixes[i+3]*gaussMatrix[j+radius];
                    gaussSum+=gaussMatrix[j+radius];
                
                }
            }
            i=(y*width+x)*4;
            //除以gaussSum是为了消除处于边缘的像素，高斯运算不足的问题
            pixes[i]=r/gaussSum;
            pixes[i+1]=g/gaussSum;
            pixes[i+2]=b/gaussSum;
            // pixes[i+3]=a/gaussSum;
            // pixes[i+3]=a;
        }
    }
    // y方向一维高斯运算
    for(x=0;x<width;x++){
        for(y=0;y<height;y++){
            r=g=b=a=0;
            gaussSum=0;
            for(j=-radius;j<=radius;j++){
                k=y+j;
                if(k>=0 && k<height){
                    // 确保k没超出y的范围
                    // r,g,,b,a四个一组
                    i=(k*width+x)*4;
                    r+=pixes[i]*gaussMatrix[j+radius];
                    g+=pixes[i+1]*gaussMatrix[j+radius];
                    b+=pixes[i+2]*gaussMatrix[j+radius];
                    // a+=pixes[i+3]*gaussMatrix[j+radius];
                    gaussSum+=gaussMatrix[j+radius];
                }
            }
            i=(y*width+x)*4;
            //除以gaussSum是为了消除处于边缘的像素，高斯运算不足的问题
            pixes[i]=r/gaussSum;
            pixes[i+1]=g/gaussSum;
            pixes[i+2]=b/gaussSum;
            // pixes[i+3]=a/gaussSum;
            // pixes[i+3]=a;
        }
    }
    return imgData;
}

// 格式化歌词
// 原来的字符串格式：[00:16.64]白鸽在长椅下\n[00:20.41]等来了一只乌鸦
// 格式化后：[{time:16.64,lyric:"白鸽在长椅下"},{time:20.41,lyric:"等来了一只乌鸦"}]
export function formatSongLyric(lyricStr){
    if(typeof lyricStr!="string") return "歌词加载失败";
    const tempArr=lyricStr.split("\n");
    const lyric=tempArr.map((v,i)=>{
        let reg=/^\[(\w*:\w*.?\w*)\](.*)/g;
        let lyricObj={};
        if(reg.test(v)){
            let timeStr=RegExp.$1;
            let second=timeStr.split(":").reduce((accumulator,curValue)=> 60*Number(accumulator)+Number(curValue)).toFixed(2);
            lyricObj.time=Number(second);
            lyricObj.lyric=RegExp.$2;
        }
        return lyricObj;
    })
    return lyric;
}


// 添加歌曲列表去除重复
export function songListFilter(songList){
    let songListArr=JSON.parse(window.localStorage.getItem("songList")||"[]");
    let addToList=songList.map((item)=>({
        id:item.id,
        name:item.name,
        ar:item.ar,
        dt:item.dt,
    }));
    // 去重
    songListArr=[...addToList,...songListArr];
    const tempMap=new Map();
    songListArr.forEach((item)=>{
        // 通过此方法达到的map对象格式为{item.id->item,key值唯一性}
        !tempMap.has(item.id) && tempMap.set(item.id,item);
    })
    // 限制数量
    const limitArr=[...tempMap.values()];
    limitArr.length>100 && (limitArr=limitArr.slice(limitArr.length-100));
    return limitArr;
}